用 Rsync 同步文件夹

Remote synchronization

[!INFO] Rsync : 一个命令行工具,使用差异算法,只传输源文件和目标文件之间的差异部分。

最初很折腾

安装

  1. 远程安装 rsync。
  2. 本地下载 cwrsync 后解压。

SHH 协议传输

配置密钥

使用密钥连接 SSH

  1. 生成密钥
ssh-keygen -t rsa -b 4096 -C "g1169861954@gmail.com"
  1. 创建 .ssh 文件夹,并保存密钥路径
F:\cwrsync\.ssh\id_rsa
  1. 上传公钥到远程服务器
type F:\cwrsync\.ssh\id_rsa.pub | ssh user@hostname "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"

传输文件

  1. 将解压文件夹移至同步盘,并进入
F:\cwrsync\bin\
  1. 将同步文件复制到 cwrsync 目录下
  2. 传输文件
rsync -avz -e ./ssh /www root@hostname:/var/
rsync -avz -e "./ssh -i /.ssh/id_rsa" /www root@hostname:/var/

[!QUESTION] 同步后,Nginx 无权限访问

  1. 同步后,授予权限
chown -R www-data:www-data /var/www/
chmod -R 755 /var/www/

避免复制操作

rsync -avz -e "./ssh -i /.ssh/id_rsa" /cygdrive/f/www root@hostname:/var/

避免切换目录操作

F:\cwrsync\bin\rsync -avz -e "/cygdrive/f/cwrsync/bin/ssh -i /.ssh/id_rsa" /cygdrive/f/www root@hostname:/var/

避免授权操作

F:\cwrsync\bin\rsync -avz --chown=www-data:www-data -e "/cygdrive/f/cwrsync/bin/ssh -i /.ssh/id_rsa" /cygdrive/f/www root@hostname:/var/
F:\cwrsync\bin\rsync -avz --chown=775 -e "/cygdrive/f/cwrsync/bin/ssh -i /.ssh/id_rsa" /cygdrive/f/www root@hostname:/var/

忽略文件(无效

  1. --cvs-exclude-Crsync 命令的选项之一。它用于以类似于 CVS (Concurrent(并行) Versions System) 的方式自动忽略文件。
  2. 编写规则:每行一个模式规则,用于匹配要忽略的文件或目录。
    1. 忽略指定文件或目录: filename # 忽略特定文件 directory/ # 忽略特定目录
    2. 使用通配符模式进行忽略: *.txt # 忽略所有以 .txt 结尾的文件 dir* # 忽略以 "dir" 开头的目录
    3. 使用斜杠 / 指定特定目录下的文件: dir/*.txt # 忽略 "dir" 目录下的所有 .txt 文件
    4. 使用斜杠 / 指定递归忽略: dir/ # 忽略整个 "dir" 目录及其内容
  3. 运行命令
rsync -avz -C -e "./ssh -i /.ssh/id_rsa" /www root@hostname:/var/

[!NOTE]

  1. cwrsync 文件夹相当于一个根目录下只有 /user 文件夹的类 Linux 环境。
  2. 将文件复制到 cwrsync目录下,再以 Linux 风格执行命令没有问题。
  3. 但通过 \ 访问 Windows 路径,会将整个路径文本作为目录名输出而无法正确解析出来源路径
  4. 对于 rsync 命令用法,双引号会被当成主机名,而冒号会被当作远程目录。

[!WARNING] 必须指定该目录下的 ssh ,否则会冲突

RSYNC 协议传输

待定

配置守护进程

  1. 创建配置文件 bash vi /etc/rsyncd.conf

  2. 内容

    [dreamforest]
    path = /var/www/dreamforest.com
    comment = My Dream Forest
    uid = nobody
    gid = nogroup
    read only = no
    auth users = your_username
    secrets file = /etc/rsyncd.secrets
    
  3. 创建 /etc/rsyncd.secrets 文件,并设置权限:

   touch /etc/rsyncd.secrets
   chmod 600 /etc/rsyncd.secrets
  1. /etc/rsyncd.secrets 文件中添加用户名和密码:
vi /etc/rsyncd.secrets
   your_username:your_password
ps aux | grep rsync
  1. 更改配置文件需重启 rsync 服务:??
   systemctl restart rsync
rsync --daemon
cd /var; mkdir www; cd www; mkdir dreamforest.com

important

deamon 要配置ip许可,以增加他人的访问难度 ssh密码别人可以试吗?如何确保安全? couchdb 安全吗?ssl安全吗?

ssh协议不需要额外配置‘

报错是因为 ssh 程序版本冲突,不是密钥冲突,这是从 linux 打包的 rsync,只能用适配的 ssh !就像我单独用一个 rsync.exe 无反应一样。

F:\>cwrsync\bin\rsync -avz -e ssh \Obsidian\ root@hostname:/var/www                            
root@hostname's password:                                                                      
rsync: connection unexpectedly closed (0 bytes received so far) [Receiver]                           
rsync error: error in rsync protocol data stream (code 12) at io.c(235) [Receiver=3.1.3]             
rsync: connection unexpectedly closed (0 bytes received so far) [sender]                             
rsync error: error in rsync protocol data stream (code 12) at io.c(231) [sender=3.2.7]

-avz source 就是默认 -ave -e ssh.

a, v, z

rsyncd.conf and rsyncd.secrets dreamforest configuration

ANSWER

rsyncd.conf 和 rsyncd.secrets 是用于配置和授权 rsync 服务器的两个文件。

下面是一个例子:

rsyncd.conf

motd file = /etc/rsyncd/rsyncd.motd log file = /var/log/rsyncd.log pid file = /var/run/rsyncd.pid [my_module] path = /path/to/my_module comment = My Rsync Module read only = false list = true uid = my_user gid = my_group auth users = my_user secrets file = /etc/rsyncd/rsyncd.secrets

motd file = /etc/rsyncd/rsyncd.motd
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid

[my_module]
path = /path/to/my_module
comment = My Rsync Module
read only = false
list = true
uid = my_user
gid = my_group
auth users = my_user
secrets file = /etc/rsyncd/rsyncd.secrets

rsyncd.secrets

my_user:my_password

my_user:my_password

以上是一个简单的 rsync 配置和授权的例子。在实际使用中,可以根据需要进行更改和扩展。

find / -name rsyncd.conf
/usr/share/doc/rsync/dreamforests/rsyncd.conf
rsync --daemon --config=/usr/share/doc/rsync/dreamforests/rsyncd.conf
kill \<PID>
F:cwrsync\bin\
rsync -avz -e ssh \Obsidian\1. 项目\ root@hostname:/var/www/dreamforest.com
F:
cwrsync\bin\rsync -avz \Obsidian\ rsync://hostname/var/www/dreamforest.com

[!BUG] 报错,疑似 ssh 冲突,键入 where ssh 出现两个地址

rsync: connection unexpectedly closed (0 bytes received so far) [Receiver]
rsync error: error in rsync protocol data stream (code 12) at io.c(235) [Receiver=3.1.3]
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: error in rsync protocol data stream (code 12) at io.c(231) [sender=3.2.7]
rsync.exe -avz -e ./ssh.exe "/f/Obsidian/0. 发布/" root@hostname:/var/www.dreamforest.com
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1336) [sender=3.2.7]
chmod -R 777 www.dreamforest.com
rsync: [sender] change_dir "/f/Obsidian/0. 发布" failed: No such file or directory (2)

弄来弄去都不知道资源路径到底为啥不对,网上也找不到资料,不用他妈的 rsync 了。SFTP 直接支持 SSH 连接。